// 版权所有2016 etcd作者
// 
// 根据Apache许可证2.0版（以下简称“许可证”）获得许可；
// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

// Package clientv3实现了v3的官方Go etcd客户端。
// 
// 使用`clientv3'创建客户端。新的“：
// 
// /期望ipv4黑洞上的拨号超时
// ，错误：=clientv3。新建（clientv3.Config{
// 端点：[]字符串{”http:
// /拨号超时：2*时间。第二，
// }）
// /
// /etcd clientv3>=v3。2.10，grpc/grpc go>=v1。7.3 
// 如果错误==上下文。死线超出{
// /处理错误
// }
// /
// /etcd客户端v3<=v3。2.9，grpc/grpc go<=v1。2.1 
// 如果错误==grpc。ErrClientConnTimeout{
// /处理错误
// }
// /
// /cli，错误：=clientv3。新建（clientv3.Config{
// 端点：[]字符串{“localhost:2379”，“localhost:22379”，“localhost:32379”}，
// /拨号超时：5*时间。第二，
// }）
// /如果错误！=无{
// /句柄错误！
// }
// /延迟cli。Close（）
// 
// 请确保在使用完客户端后将其关闭。如果客户端未关闭，
// 连接将有泄漏的goroutine。
// 
// 若要指定客户端请求超时，请使用上下文包装上下文。WithTimeout:
// 
// ctx，cancel:=上下文。WithTimeout（context.Background（），timeout）
// resp，err:=kvc。Put（ctx，“样本密钥”，“样本值”）
// 取消（）
// 如果错误！=nil{
// /处理错误！
// }
// /使用响应
// 
// 客户端具有内部状态（监视程序和租约），因此应该重用客户端，而不是根据需要创建客户端。
// 多个goroutine同时使用客户端是安全的。
// 
// etcd客户端返回两种类型的错误：
// 
// 1。上下文错误：已取消或超过截止日期。
// 2。gRPC错误：例如，在超过客户端上下文截止日期之前，服务器端时钟漂移。
// 参见https:
// 
// 以下是处理客户端错误的示例代码：
// 
// resp，err:=kvc。Put（ctx，“，”）
// 如果出错！=nil{
// if err==context.cancelled{
// /ctx被另一个例程
// }取消，否则如果err==context.deadlineextered{
// /ctx附加了一个截止日期，它超过了
// }否则如果err==rpctypes.ErrEmptyKey{
// /客户端错误：未提供密钥
// }否则如果ev，则确定：=status.FromError（err）；确定{
// /代码：=ev.code（）
// 如果代码==code.deadlineextered{
// /服务器端上下文可能首先超时（由于时钟偏移）
// /虽然原始客户端上下文尚未超时
// }
// }其他{
// /错误的群集终结点，它们不是etcd服务器
// }
// }
// /
// ，err:=kvc.Get（ctx，“a”）
// if err！=nil{
// /with etcd clientv3<=v3.3 
// /if err==context.cancelled{
// /grpc平衡器使用飞行中的客户端调用“Get”。如果err==grpc.errclientconclosing
// /grpc平衡器在client.Close.
// }
// /with etcd clientv3>=v3.4 
// /if clientv3.isconceled（err）{
// /grpc客户端连接已关闭
// /}
// }
// 
// /grpc负载平衡器是静态注册的，并在etcd客户端之间共享。
// 要启用详细的负载平衡器日志记录，请设置ETCD_CLIENT_调试环境
// 变量。例如，“ETCD_客户端_调试=1”。
// 
package clientv3
